package dao;

import anno.Component;
import pojo.Hall;
import utils.JDBCUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class HallDAO extends AbstractBaseDao<Hall> {

    /**
     * 分页模糊查询影厅
     *
     * @param keyword  模糊查询关键字
     * @param pageNum  当前页码
     * @param pageSize 每页记录数
     * @return 分页查询结果
     * @throws SQLException SQL异常
     */
    public Map<String, Object> findHallsByPageAndName(String keyword, int pageNum, int pageSize) throws SQLException {
        String sql = "SELECT * FROM tb_halls WHERE name LIKE ?";
        return findByPageAndKeyword(sql, keyword, pageNum, pageSize);
    }

    /**
     * 根据影厅名称查询影厅
     *
     * @param name 影厅名称
     * @return 符合条件的影厅列表
     * @throws SQLException SQL异常
     */
    public List<Hall> findByName(String name) throws SQLException {
        return findByField("name", name);
    }

    /**
     * 根据电影院ID查询影厅
     *
     * @param cinemaId 电影院ID
     * @return 符合条件的影厅列表
     * @throws SQLException SQL异常
     */
    public List<Hall> findByCinemaId(Integer cinemaId) throws SQLException {
        return findByField("cinemaId", cinemaId);
    }

    /**
     * 分页模糊查询影厅的辅助方法
     *
     * @param sql      查询SQL
     * @param keyword  模糊查询关键字
     * @param pageNum  当前页码
     * @param pageSize 每页记录数
     * @return 分页查询结果
     * @throws SQLException SQL异常
     */
    private Map<String, Object> findByPageAndKeyword(String sql, String keyword, int pageNum, int pageSize) throws SQLException {
        int offset = (pageNum - 1) * pageSize;
        String countSql = "SELECT COUNT(*) FROM (" + sql + ") tmp";
        String querySql = sql + " LIMIT ?, ?";

        // 查询符合条件的影厅总数
        ResultSet rsCount = (ResultSet) JDBCUtils.execute(countSql, "%" + keyword + "%");
        int totalRecords = 0;
        if (rsCount.next()) {
            totalRecords = rsCount.getInt(1);
        }

        // 查询符合条件的影厅列表
        ResultSet rsQuery = (ResultSet) JDBCUtils.execute(querySql, "%" + keyword + "%", offset, pageSize);
        List<Hall> hallList = new ArrayList<>();
        while (rsQuery.next()) {
            hallList.add(mapResultSetToEntity(rsQuery));
        }

        // 将数据和总记录数封装到Map中
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("data", hallList);
        resultMap.put("total", totalRecords);

        return resultMap;
    }
}